import { UserSettings, STORAGE_KEYS, DEFAULT_SETTINGS } from '../types';

/**
 * 保存编辑器内容到本地存储
 */
export function saveContent(content: string): void {
  try {
    localStorage.setItem(STORAGE_KEYS.EDITOR_CONTENT, content);
  } catch (error) {
    console.error('保存编辑器内容失败:', error);
  }
}

/**
 * 从本地存储加载编辑器内容
 */
export function loadContent(): string | null {
  try {
    return localStorage.getItem(STORAGE_KEYS.EDITOR_CONTENT);
  } catch (error) {
    console.error('加载编辑器内容失败:', error);
    return null;
  }
}

/**
 * 保存用户设置到本地存储
 */
export function saveSettings(settings: UserSettings): void {
  try {
    localStorage.setItem(STORAGE_KEYS.USER_SETTINGS, JSON.stringify(settings));
  } catch (error) {
    console.error('保存用户设置失败:', error);
  }
}

/**
 * 从本地存储加载用户设置
 */
export function loadSettings(): UserSettings {
  try {
    const settingsStr = localStorage.getItem(STORAGE_KEYS.USER_SETTINGS);
    if (!settingsStr) {
      return DEFAULT_SETTINGS;
    }
    
    const settings = JSON.parse(settingsStr);
    // 合并默认设置，确保新增的设置项有默认值
    return { ...DEFAULT_SETTINGS, ...settings };
  } catch (error) {
    console.error('加载用户设置失败:', error);
    return DEFAULT_SETTINGS;
  }
}

/**
 * 保存最近打开的文件列表
 */
export function saveRecentFiles(files: string[]): void {
  try {
    // 限制最近文件数量为10个
    const recentFiles = files.slice(0, 10);
    localStorage.setItem(STORAGE_KEYS.RECENT_FILES, JSON.stringify(recentFiles));
  } catch (error) {
    console.error('保存最近文件失败:', error);
  }
}

/**
 * 获取最近打开的文件列表
 */
export function getRecentFiles(): string[] {
  try {
    const filesStr = localStorage.getItem(STORAGE_KEYS.RECENT_FILES);
    return filesStr ? JSON.parse(filesStr) : [];
  } catch (error) {
    console.error('获取最近文件失败:', error);
    return [];
  }
}

/**
 * 添加文件到最近打开列表
 */
export function addToRecentFiles(filename: string): void {
  try {
    const recentFiles = getRecentFiles();
    // 移除已存在的同名文件
    const filteredFiles = recentFiles.filter(file => file !== filename);
    // 添加到列表开头
    const updatedFiles = [filename, ...filteredFiles];
    saveRecentFiles(updatedFiles);
  } catch (error) {
    console.error('添加最近文件失败:', error);
  }
}

/**
 * 从最近打开列表中移除文件
 */
export function removeFromRecentFiles(filename: string): void {
  try {
    const recentFiles = getRecentFiles();
    const updatedFiles = recentFiles.filter(file => file !== filename);
    saveRecentFiles(updatedFiles);
  } catch (error) {
    console.error('移除最近文件失败:', error);
  }
}

/**
 * 清空所有本地存储数据
 */
export function clearAllStorage(): void {
  try {
    Object.values(STORAGE_KEYS).forEach(key => {
      localStorage.removeItem(key);
    });
  } catch (error) {
    console.error('清空本地存储失败:', error);
  }
}

/**
 * 获取本地存储使用情况
 */
export function getStorageUsage(): { used: number; total: number; percentage: number } {
  try {
    let used = 0;
    for (let key in localStorage) {
      if (localStorage.hasOwnProperty(key)) {
        used += localStorage[key].length + key.length;
      }
    }
    
    // 大多数浏览器的localStorage限制为5MB
    const total = 5 * 1024 * 1024; // 5MB in bytes
    const percentage = (used / total) * 100;
    
    return { used, total, percentage };
  } catch (error) {
    console.error('获取存储使用情况失败:', error);
    return { used: 0, total: 0, percentage: 0 };
  }
}

/**
 * 检查本地存储是否可用
 */
export function isStorageAvailable(): boolean {
  try {
    const test = '__storage_test__';
    localStorage.setItem(test, test);
    localStorage.removeItem(test);
    return true;
  } catch (error) {
    return false;
  }
}

/**
 * 导出所有设置和数据
 */
export function exportAllData(): string {
  try {
    const data: Record<string, any> = {};
    
    Object.values(STORAGE_KEYS).forEach(key => {
      const value = localStorage.getItem(key);
      if (value) {
        data[key] = value;
      }
    });
    
    return JSON.stringify(data, null, 2);
  } catch (error) {
    console.error('导出数据失败:', error);
    return '{}';
  }
}

/**
 * 导入设置和数据
 */
export function importAllData(dataStr: string): boolean {
  try {
    const data = JSON.parse(dataStr);
    
    Object.entries(data).forEach(([key, value]) => {
      if (Object.values(STORAGE_KEYS).includes(key as any)) {
        localStorage.setItem(key, value as string);
      }
    });
    
    return true;
  } catch (error) {
    console.error('导入数据失败:', error);
    return false;
  }
}